package com.xzgj.fmmall.controller;

import com.github.pagehelper.PageInfo;
import com.github.wxpay.sdk.WXPay;
import com.github.wxpay.sdk.WXPayConfig;
import com.xzgj.fmmall.config.MyPayConfig;
import com.xzgj.fmmall.entity.Orders;
import com.xzgj.fmmall.service.OrderService;
import com.xzgj.fmmall.vo.OrdersVO;
import com.xzgj.fmmall.vo.ResStatus;
import com.xzgj.fmmall.vo.ResultVO;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.Map;

@RestController
@CrossOrigin
@RequestMapping("/order")
@Api(value = "提供下单业务的相关接口",tags = "订单管理")

public class OrdersController {

    @Resource
    private OrderService orderService;

    @ApiOperation("添加订单接口")
    @PostMapping(value = "/add")
    public ResultVO add(String cartIds,@RequestBody Orders order){

        ResultVO resultVO = null;
        try {
            Map<String,String> orderInfo = orderService.addOrder(cartIds,order);
            String orderId = orderInfo.get("orderId");
            String untitled = orderInfo.get("productNames");
            String actualPrice = order.getActualAmount()*100+"";
            //处理后的价格
            actualPrice = actualPrice.substring(0,actualPrice.lastIndexOf("."));
            if (orderId!=null){
                //保存订单后要返回 申请支付链接 和 订单编号：1.微信支付；
                /**
                 * 微信支付:就是通过微信平台为商家（系统）提供代收款服务
                 *
                 * 1.商家向平台注册，申请商户号
                 * 2.向微信平台申请支付账单（参数：商户编号；商户账号；商户key）
                 * 3.申请支付订单---商户向支付平台申请支付链接
                 * 3.1 支付订单，并不是用户提交的商品订单，而是商户向微信支付平台申请的支付链接
                 * 3.2 导入微信支付的依赖---wxpay的maven依赖 WxPay SDK
                 */
//创建微信支付配置类，配置商户信息，实现接口，重写三分方法，分别设置商户信息
                WXPay wxPay = new WXPay(new MyPayConfig());
//设置当前订单信息
                HashMap<String,String> data = new HashMap<>();
                data.put("body",untitled);//商品描述
                data.put("out_trade_no",orderId);//使用当前用户订单的编号作为当前支付交易的交易号

                data.put("fee_type","CNY");
//                data.put("total_fee", actualPrice);//支付金额
                data.put("total_fee", "1");//支付金额，为了测试，设置1分钱

                data.put("trade_type","NATIVE");//交易类型
                //在订单接口中申请支付连接的时候将回调接口当路径设置给微信支付平台
                data.put("notify_url","/pay/callback");//设置支付完成是的回调接口

//发送请求，获取响应
                //微信支付：申请支付连接
                Map<String,String> resp = wxPay.unifiedOrder(data);
                System.out.println("resp:" + resp);//返回的code_url就是支付链接
                /**
                 * resp:{nonce_str=nIT7Ch43M51doDs9, code_url=weixin://wxpay/bizpayurl?pr=U1zwosxzz, appid=wx632c8f211f8122c6, sign=5006EE7E92849AFC4755EF8D88676346, trade_type=NATIVE, return_msg=OK, result_code=SUCCESS, mch_id=1497984412, return_code=SUCCESS, prepay_id=wx28091559576983613399185c0917790000}
                 */
                orderInfo.put("payUrl",resp.get("code_url"));
                resultVO = new ResultVO(ResStatus.OK,ResStatus.orderSuccess,orderInfo);

            }else {
                resultVO = new ResultVO(ResStatus.OK,ResStatus.submitOrderFailure,null);

            }

        } catch (Exception e){
            e.printStackTrace();
            resultVO = new ResultVO(ResStatus.OK,ResStatus.submitOrderFailure,null);
        }
        return resultVO;
    }

    @ApiOperation("通过订单id查询订单状态接口")
    @GetMapping(value = "/status/{orderId}")
    public ResultVO getOrderStatus(@PathVariable("orderId") String orderId ,@RequestHeader("token") String token){

        return orderService.getOrderStatusByOrderId(orderId);
    }

    /**
     * 订单超时取消：指的是用户在成功提交订单之后，在规定的时间内没有支付，则将订单还原库存
     *
     * 实现订单的超时取消业务通常有两种解决方案：
     * 1。定时任务：循环扫描（quartz）
     * 2。延时队列：MQ
     *
     * 业务需求：
     * 每隔5s查询订单表状态为未支付，下单时间超过30min，还未支付的订单信息
     *
     * 在线cron表达式生成器
     * https://cron.qqe2.com
     *
     * 在启动类开启定时任务@EnableSchedual
     */

    @ApiOperation("查询订单列表接口")
    @ApiImplicitParams({
            @ApiImplicitParam(dataType = "int", name = "pageNo", value = "页码", required = true, defaultValue = "1"),
            @ApiImplicitParam(dataType = "int", name = "pageSize", value = "页码size", required = true, defaultValue = "10")
    })
    @GetMapping(value = "/order/list")
    public PageInfo<Orders> getOrderList(@RequestParam(value="pageNo",defaultValue="1")int pageNo, @RequestParam(value="pageSize",defaultValue="10")int pageSize, @RequestHeader("token") String token){

        return orderService.getOrdersList(pageNo,pageSize);
    }

    @ApiOperation("根据用户ID和订单状态查询订单列表分页接口")
    @GetMapping(value = "/listOrders")
    @ApiImplicitParams({
            @ApiImplicitParam(dataType = "string", name = "userId", value = "用户ID", required = true),
            @ApiImplicitParam(dataType = "string", name = "status", value = "订单状态", required = false),
            @ApiImplicitParam(dataType = "int", name = "pageNo", value = "页码", required = true, defaultValue = "1"),
            @ApiImplicitParam(dataType = "int", name = "pageSize", value = "页码size", required = true, defaultValue = "10")
    })
    public PageInfo<OrdersVO> listOrders(String userId, String status, @RequestParam(value="pageNo",defaultValue="1")int pageNo, @RequestParam(value="pageSize",defaultValue="10")int pageSize, @RequestHeader("token") String token){
        return orderService.listOrders(userId,status,pageNo,pageSize);
    }
}
